﻿using System;
using System.Collections.Generic;
using System.Text;

namespace QLua.Exceptions;

[Serializable]
public class LuaScriptException : LuaException
{
	/// <summary>
	/// Returns true if the exception has occurred as the result of a .NET exception in user code
	/// </summary>
	public bool IsNetException { get; }

	private readonly string _source;

	/// <summary>
	/// The position in the script where the exception was triggered.
	/// </summary>
	public override string Source => _source;

	/// <summary>
	/// Creates a new Lua-only exception.
	/// </summary>
	/// <param name="message">The message that describes the error.</param>
	/// <param name="source">The position in the script where the exception was triggered.</param>
	public LuaScriptException(string message, string source) : base(message)
	{
		_source = source;
	}

	/// <summary>
	/// Creates a new .NET wrapping exception.
	/// </summary>
	/// <param name="innerException">The .NET exception triggered by user-code.</param>
	/// <param name="source">The position in the script where the exception was triggered.</param>
	public LuaScriptException(Exception innerException, string source)
		: base("A .NET exception occurred in user-code", innerException)
	{
		_source = source;
		IsNetException = true;
	}

	public override string ToString()
	{
		// Prepend the error source
		return GetType().FullName + ": " + _source + Message;
	}
}
